package com.orzxlee.Stream03;

import java.util.*;
import java.util.stream.Stream;

/*
    第五节 Stream流

        1. Stream<T> filter(Predicate<? super T> predicate);

        Predicate 四大常用函数式接口,用于给定参数判断,返回布尔值

        2.limit  截取流
        3.skip  跳过流
        4.concat(Stream a,Stream b) 合并a,b流
        5.distinct   返回流的不同元素
        6.sorted() 自然排序流
        7.sorted(Comparator comparator) 根据Comparator 进行排序
        8.map(Function mapper) 返回由函数限定的流
        9.mapToInt(ToIntFunction mapper) 返回由函数限定的IntStream流
       10.forEach(Consumer c)
                Consumer 接口 void accept() 对给定参数执行此操作
       11.Long count();返回此流中的元素数

 */
public class Demo {
    public static void main(String[] args) {
        //创建集合
        ArrayList<String> list = new ArrayList<>();
        list.add("林青霞");
        list.add("张曼玉");
        list.add("王祖贤");
        list.add("柳岩");
        list.add("张敏");
        list.add("张无忌");

        ArrayList<String> list2 = new ArrayList<>();
        list2.add("lqx");
        list2.add("zmy");
        list2.add("wzx");
        list2.add("ly");
        list2.add("zm");
        list2.add("zwj");

        ArrayList<String> list3 = new ArrayList<>();
        list3.add("10");
        list3.add("20");
        list3.add("30");
        list3.add("40");
        list3.add("50");
        list3.add("60");

        //练习forEach,Long count
        //list.stream().forEach(System.out::println);
        //统计"张" 开头的元素,输出
        list.stream().filter(s -> s.startsWith("张")).forEach(System.out::println);


        //练习map mapToInt
        //需求:将list3集合中的字符串转为int类型数据输出
        //testFun4(list3);

        //练习Filter
        //testFilter(list);
        //练习 limit,skip
        //testFun1(list);

        //练习concat,distinct
        //testFun2(list);

        //练习sorted()
        //1.按照字母顺序输出元素
        //list2.stream().sorted().forEach(System.out::println);

        //2.按照字符串长度 输出
        //testFun3(list2);


    }

    private static void testFun4(ArrayList<String> list3) {
        //list3.stream().map(s -> Integer.parseInt(s)).forEach(System.out::println);
        //list3.stream().map(Integer::parseInt).forEach(System.out::println);

        //list3.stream().mapToInt(Integer::parseInt).forEach(System.out::println);
        //求和
        int sum = list3.stream().mapToInt(Integer::parseInt).sum();
        System.out.println(sum);
    }

    private static void testFun3(ArrayList<String> list2) {
        //升序,并按照字典顺序排序
//        list2.stream().sorted((o1, o2) -> {
//            //升序排列
//            int num = o1.length() - o2.length();
//            //当字符串长度相等的时候,进行按字典顺序排序
//            int num2 = num == 0?o1.compareTo(o2):num;
//            return num2;
//
//        }).forEach(System.out::println);
        //降序 并按照字典顺序排序
//        list2.stream().sorted((o1, o2) -> {
//            //降序排列
//            int num = o2.length() - o1.length();
//            //当字符串长度相等的时候,进行按字典顺序排序
//            int num2 = num == 0?o1.compareTo(o2):num;
//            return num2;
//
//        }).forEach(System.out::println);
    }

    private static void testFun2(ArrayList<String> list) {
        //1.取前四个数据组成一个流
        Stream<String> limit = list.stream().limit(4);
        //2.跳过两个数据组成一个流
        Stream<String> skip = list.stream().skip(2);

        //3.合并需求1和需求2得到的流,输出结果
        //Stream.concat(limit, skip).forEach(System.out::println);

        //4.合并需求1和需求2得到的流,字符串元素不能重复,输出结果
        Stream.concat(limit,skip).distinct().forEach(System.out::println);
    }

    private static void testFun1(ArrayList<String> list) {
        //1.取前三个数据,输出
        // list.stream().limit(3).forEach(System.out::println);

        //2.跳过三个元素,输出剩余流
        //list.stream().skip(3).forEach(System.out::println);

        //3.跳过三个元素,把剩余的前两个输出
        //list.stream().skip(3).limit(2).forEach(System.out::println);
    }


    private static void testFilter( ArrayList<String> list) {
        //1.把list集合中以"张"开头的元素输出
        //list.stream().filter(s -> s.startsWith("张")).forEach(s -> System.out.println(s));
        //list.stream().filter(s -> s.startsWith("张")).forEach(System.out::println);


        //2.把list集合中长度为3的元素输出
        //list.stream().filter(s -> s.length() == 3).forEach(System.out::println);


        //3.把list集合中以"张"开头的,长度为3的元素的输出
        //list.stream().filter(s -> s.length() == 3).filter(s -> s.startsWith("张")).forEach(System.out::println);
    }
}
